/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package warehouse;

import archive.ReportActionForm;
import ejb.archive.Report;
import ejb.archive.ReportFacadeRemote;
import ejb.laboratory.Controllo;
import ejb.laboratory.ControlloFacadeRemote;
import ejb.laboratory.Validazione;
import ejb.laboratory.ValidazioneFacadeRemote;
import ejb.warehouse.OrdineProdotto;
import ejb.warehouse.OrdineProdottoFacadeRemote;
import ejb.warehouse.Prodotto;
import ejb.warehouse.ProdottoFacadeRemote;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import laboratory.ValidCheckActionForm;
import org.apache.struts.action.ActionErrors;


import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import system.LoginActionForm;
import system.Utilities;

/**
 *
 * @author ciummo
 */
public class ProductAction extends DispatchAction {

    /*
     * forward name="success" path=""
     */
    private final static String SUCCESS = "success";
    private final static String TONEWPRODUCT = "toNewProduct";
    private final static String TOWAREHOUSEADMIN = "toWarehouseAdmin";
    
    
    private final static String SUCCESSSUBMITNEWPRODUCT = "successSubmitNewProduct";
    private final static String TOPRODUCTDETAILSADMIN = "toProductDetailsAdmin";
    
    
    private Utilities utility = new Utilities();
    
    
    public static final String DATE_FORMAT_NOW = "yyyy-MM-dd";
    private Calendar cal = Calendar.getInstance();
    private SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);

    
    
    public ActionForward detailsProduct(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {


        ProductActionForm productForm = (ProductActionForm) form;        
        String serialProduct = request.getParameter("serialeProdotto");
        
        /////////// DETTAGLI PRODOTTO ////////////////////
        ProdottoFacadeRemote prodottoFacade = (ProdottoFacadeRemote) utility.callRemoteBean("ProdottoFacade/remote");
        Prodotto prodotto = prodottoFacade.find(serialProduct);
                
        ProdottoBeanToProductForm prodottoToProduct = new ProdottoBeanToProductForm();        
        productForm = prodottoToProduct.convert(prodotto);
        request.getSession().setAttribute("ProductActionForm", productForm);
        ///////////////////////////////////////////////////
        
        ////////REPORT/////////////////////////////////////
        ReportFacadeRemote reportFacade = (ReportFacadeRemote) utility.callRemoteBean("ReportFacade/remote");
        ReportActionForm reportForm = new ReportActionForm();
        reportForm.setList(reportFacade.findReportByCode(serialProduct));
        request.getSession().setAttribute("ReportActionForm", reportForm);
        ///////////////////////////////////////////////////
        
        return mapping.findForward(TOPRODUCTDETAILSADMIN);
    }    
    
    
    
    public ActionForward listProduct(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        ProductActionForm productOrderForm = (ProductActionForm) form;
        ProdottoFacadeRemote prodottoFacade = (ProdottoFacadeRemote) utility.callRemoteBean("ProdottoFacade/remote");
        
        
        //TODO INSERIRE FUNC
        //String func = request.getParameter("func");
        
        productOrderForm.setList(prodottoFacade.findAll());
        
        
        return mapping.findForward(TOWAREHOUSEADMIN);
    }    
    
    
    public ActionForward newProduct(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        ProductActionForm productOrderForm = (ProductActionForm) form;
        
        int idOrderProduct = Integer.parseInt(request.getParameter("idOrderProduct"));
        

        
        if (idOrderProduct!=0){
            
            
            OrdineProdottoFacadeRemote ordineProdottoFacade = (OrdineProdottoFacadeRemote) utility.callRemoteBean("OrdineProdottoFacade/remote");

            OrdineProdotto ordineProdotto = ordineProdottoFacade.find(idOrderProduct);

            productOrderForm.setCodArticolo(ordineProdotto.getCodArticolo());
            productOrderForm.setIdOrdineProdotto(idOrderProduct);
        }
        
        return mapping.findForward(TONEWPRODUCT);
    }


    public ActionForward submitNewProduct(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        ProductActionForm productForm = (ProductActionForm) form; 
        
        ActionErrors errors = form.validate(mapping, request);

        if (!errors.isEmpty()) {
            saveErrors(request, errors);
            return  mapping.findForward(TONEWPRODUCT);
        }
        
        
        
        ProdottoFacadeRemote prodottoFacade = (ProdottoFacadeRemote) utility.callRemoteBean("ProdottoFacade/remote");
       
        ProductFormToProdottoBean productToProdotto = new ProductFormToProdottoBean();
       
        ControlloFacadeRemote controlloFacade = (ControlloFacadeRemote) utility.callRemoteBean("ControlloFacade/remote");
        
               
               
        List <Controllo> controlli = controlloFacade.findControlliBycodArticolo(productForm.getCodArticolo());
        
        
        
        //Per l'oggetto in questione non esistono check, quindi è solo da validare
        if (controlli.isEmpty()){
            
            productForm.setStato("Da Validare");
            
        }
        
        // La check esiste, quindi la instanzio!
        else {
            
            Controllo controllo = new Controllo();
            
            ValidazioneFacadeRemote validazioneFacade = (ValidazioneFacadeRemote) utility.callRemoteBean("ValidazioneFacade/remote");
            
            Validazione validazione;
            
            for (int i = 0; i < controlli.size(); i++){
                
                validazione = new Validazione();
                
                
                controllo = controlli.get(i);
                
                validazione.setSerialProdotto(productForm.getSerialeProdotto());
                validazione.setTesto(controllo.getTesto());
                validazione.setValore("false");
                validazioneFacade.create(validazione);
            }
            
            productForm.setStato("Nuovo");
            
        }
       
       
        prodottoFacade.create(productToProdotto.convert(productForm));
       
        /////////////REPORT//////////////////////////////////////////////////////
        ReportFacadeRemote reportFacade = (ReportFacadeRemote) utility.callRemoteBean("ReportFacade/remote");
        Report report = new Report();
        
        report.setCodRiferimento(productForm.getSerialeProdotto());
        report.setData(sdf.format(cal.getTime()));
        
        LoginActionForm loginForm = (LoginActionForm) request.getSession().getAttribute("LoginActionForm"); 
        
        report.setIdUtente(loginForm.getUsername());
        
        report.setTipo("Prodotto Creato");
        
        reportFacade.create(report);
        /////************************************************************///////
        
        
        
        List <Prodotto> prodotti = prodottoFacade.findProdottiByIdOrdineProdotto(productForm.getIdOrdineProdotto());
        
        OrdineProdottoFacadeRemote ordineProdottoFacade = (OrdineProdottoFacadeRemote) utility.callRemoteBean("OrdineProdottoFacade/remote");
        
        OrdineProdotto ordineProdotto = ordineProdottoFacade.find(productForm.getIdOrdineProdotto());
                
        if (prodotti.size() == ordineProdotto.getQuantita()){
            
            ordineProdotto.setStato("Completo");
            ordineProdottoFacade.edit(ordineProdotto);
        }
        
        
        request.getSession().setAttribute("idOrderProduct", productForm.getIdOrdineProdotto());
       
        
        
       return mapping.findForward(SUCCESSSUBMITNEWPRODUCT);
    }
    

}




class ProductFormToProdottoBean {
        
    Prodotto convert (ProductActionForm productForm ){
           
        Prodotto prodotto = new Prodotto();
        
        prodotto.setCodArticolo(productForm.getCodArticolo());
        prodotto.setIdOrdineProdotto(productForm.getIdOrdineProdotto());
        prodotto.setSerialeProdotto(productForm.getSerialeProdotto());
        prodotto.setDataProduzione(productForm.getDataProduzione());
        prodotto.setIdProprietario(productForm.getIdProprietario());
        prodotto.setNote(productForm.getNote());
        prodotto.setStato(productForm.getStato());
        
        return prodotto;
    }
}


class ProdottoBeanToProductForm {
    
    ProductActionForm convert (Prodotto prodotto ){
        

        ProductActionForm productForm = new ProductActionForm();
        
        productForm.setSerialeProdotto(prodotto.getSerialeProdotto());
        productForm.setCodArticolo(prodotto.getCodArticolo());
        productForm.setIdOrdineProdotto(prodotto.getIdOrdineProdotto());
        productForm.setNote(prodotto.getNote());
        productForm.setStato(prodotto.getStato());
        
        return productForm;   
    }
}